package cn.dakaqi.pingan.util;

import cn.dakaqi.utils.DateUtil;

/**
 * Created by chunyang on 2016/2/17.
 */
public class MessageHead
{
    /**
     * A001字符开头，即如下定义的222报文头。
     * 整个通讯报文由4部分组成：通信报文头(222) + 变长报文体 + 文件附件内容报文体 + 报文签名长度和签名数据
     * 其中“通信报文头”为固定长度222 字节，若长度不足，遵循字符右补空格，数字左补0的规则；
     * 报文版本
     *
     * @return
     */
    public static String A001(String regAccountXML,String sn,String tradeNO,String shopNO)throws Exception
    {

        StringBuffer sb = new StringBuffer();
        //1报文版本 A001
        sb.append("A001");
        //2目标系统 22(直通银行子系统)
        sb.append("22");
        //3报文编码 01(GBK)
        sb.append("02");
        //4通讯协议 02(http)
        sb.append("02");
        //5外联客户代码 00102079900001231000
        sb.append(shopNO);
        //6接收报文长度   XML报文体数据的字节长度（提示：不是字符串的长度）；不包括附件内容、签名内容的长度
        int regAccountLen = regAccountXML.trim().getBytes("UTF-8").length;
        String xmlLen = "";
        for(int i=1;i<=10-String.valueOf(regAccountLen).length();i++)
            xmlLen += "0";
        xmlLen = xmlLen + regAccountLen;
        sb.append(xmlLen);
        //7交易码 供应链报文统一交易码SC00,默认填写000001
        sb.append(tradeNO);
        //8操做员代码 00000
        sb.append("00000");
        //9服务类型 01 请求 02 应答
        sb.append("01");
        //10交易日期 yyyymmdd
        sb.append(DateUtil.currentDateStringTrim());
        //11交易时间 hhmmss
        sb.append(DateUtil.currentTimeStringTrim());
        //12请求方系统流水号 (企业随机生成唯一流水号 )
        sb.append(sn);
        //13返回码 请求非必输，请求时必须填写000000
        sb.append("000000");
        //14返回描述 格式为 “:交易成功”；其中冒号为英文格式半角
        String message = ":SUCCESS";
        for (int i = 1; i <= 92; i++)
            message += " ";
        //logger.info(message+":"+message.length());
        sb.append(message);
        //15后续包标志 0-结束包，1-还有后续包 目前仅支持0
        sb.append("0");
        //16请求次数 如果有后续包请求   第一次	000  第二次	001   第三次	002依此增加  目前仅支持000
        sb.append("000");
        //17签名标识 0-	不签名  1-	签名  目前仅支持填0
        sb.append("0");
        //18签名数据包格式0-	裸签    1-	PKCS7     目前仅支持送1
        sb.append("1");
        //19签名算法 RSA-SHA1
        String rsa = "RSA-SHA1    ";
        //logger.info(rsa+ ":" + rsa.length());
        sb.append(rsa);
        //20签名数据长度 签名报文数据长度, 目前仅支填写0
        sb.append("0000000000");
        //21附件数目 Y	0-	没有,默认为0；有的话填具体个数，最多9个
        sb.append("0");

        return sb.toString().trim();
    }

    /**
     * 平安银行银企直连：企业单笔资金划转
     * @param regAccountXML
     * @param tradeNO
     * @param shopNO
     * @return
     * @throws Exception
     */
    public static String A00101(String regAccountXML,String sn,String tradeNO,String shopNO)throws Exception
    {

//        <?xml version="1.0" encoding="UTF-8" ?>
//        <Result>
//        <ThirdVoucher>转账凭证号yyyymmddHHSS+8位系列</ThirdVoucher>
//        <FrontLogNo></FrontLogNo>
//        <CcyCode>RMB</CcyCode>
//        <OutAcctName>上海悠活网络科技有限公司</OutAcctName>
//        <OutAcctNo>11015100817002</OutAcctNo>
//        <InAcctBankName>中国银行上海市虹梅路支行</InAcctBankName>
//        <InAcctNo>439059222738</InAcctNo>
//        <InAcctName>上海悠活网络科技有限公司</InAcctName>
//        <TranAmount>10.00</TranAmount>
//        <UnionFlag>0</UnionFlag>
//        <AddrFlag>1</AddrFlag>
//        <Fee1></Fee1>
//        <Fee2></Fee2>
//        </Result>


        StringBuffer sb = new StringBuffer();
        //1报文类别编号	Char (6)	Y	填A00101，特殊报文双方商议
        sb.append("A00101");
        //2报文编码	Char (2)	Y	01：GBK缺省        02：UTF8        03：unicode        04：iso-8859-1        建议使用GBK编码
        sb.append("02");
        //3通讯协议	Char (2)	Y	01:tcpip 缺省        02：http        03：webservice        现在只支持：TCPIP接入
        sb.append("01");
        //4企业银企直连标准代码	Char (20)	Y	银行提供给企业的20位唯一的标识代码
        sb.append(shopNO);
        //5接收报文长度	Num(10)	Y	报文数据长度；不包括附件内容、签名内容的长度，不够左补0
        int regAccountLen = regAccountXML.trim().getBytes("UTF-8").length;
        String xmlLen = "";
        for(int i=1;i<=10-String.valueOf(regAccountLen).length();i++)
            xmlLen += "0";
        xmlLen = xmlLen + regAccountLen;
        sb.append(xmlLen);
        //6交易码	Char(6)	Y	交易码，不够右补空格
        sb.append(tradeNO);
        //7操做员代码	Char (5)	N	银行登记使用
        sb.append("00000");
        //8服务类型	Num (2)	Y	01-	请求02-	应答
        sb.append("01");
        //9交易日期 yyyymmdd
        sb.append(DateUtil.currentDateStringTrim());
        //10交易时间 hhmmss
        sb.append(DateUtil.currentTimeStringTrim());
        //11请求方系统流水号	Char(20)	Y	唯一标识一笔交易  备注：（如果某种交易要有多次请求的才能完成的，多个交易请求包流水号要保持一致）
        sb.append(sn);
        //12返回码	Char(6)	Y	请求非必输
        sb.append("000000");
        //13返回描述 格式为 “:交易成功”；其中冒号为英文格式半角
        String message = ":SUCCESS";
        for (int i = 1; i <= 92; i++)
            message += " ";
        sb.append(message);
        //14后续包标志 0-结束包，1-还有后续包 目前仅支持0
        sb.append("0");
        //15请求次数 如果有后续包请求   第一次	000  第二次	001   第三次	002依此增加  目前仅支持000
        sb.append("000");
        //16签名标识 0-	不签名  1-	签名  目前仅支持填0
        sb.append("0");
        //17签名数据包格式0-	裸签    1-	PKCS7     目前仅支持送1
        sb.append("1");
        //18签名算法 RSA-SHA1
        String rsa = "RSA-SHA1    ";
        //logger.info(rsa+ ":" + rsa.length());
        sb.append(rsa);
        //19签名数据长度 签名报文数据长度, 目前仅支填写0
        sb.append("0000000000");
        //20附件数目 Y	0-	没有,默认为0；有的话填具体个数，最多9个
        sb.append("0");

        return sb.toString().trim();
    }
}
